tfsecでconfigファイルを使ってルールを除外する
「tfsecで毎回コメントアウトせずに、特定ルールを除外したい」
tfsecのルール除外はコメントを追加するだけで良いので、とても簡単です。
しかし、「このルールは今回のプロジェクトでは無効にしたい。だけど、1個1個コメント書いていくのが面倒」ということがあるかと思います。
今回は、configファイルを使ったルールの除外方法を紹介します。
結論から、configファイルを用意しァイルを指定してtfsecを実行することで実現できます。
(以下の例では、aws-s3-encryption-customer-key
のルールが除外されます。)
--- exclude: - aws-s3-encryption-customer-key
$ tfsec --config-file tfsec.yml
やってみた
resource "aws_s3_bucket" "test" { bucket = "test-220806" } resource "aws_s3_bucket_acl" "test" { bucket = aws_s3_bucket.test.bucket acl = "private" } resource "aws_s3_bucket_public_access_block" "test" { bucket = aws_s3_bucket.test.id block_public_acls = true ignore_public_acls = true block_public_policy = true restrict_public_buckets = true } resource "aws_s3_bucket_server_side_encryption_configuration" "test" { bucket = aws_s3_bucket.test.bucket rule { apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } }
上記のtfファイルを例にして、それぞれの動作を試します。
tfsecを実行すると、highでaws-s3-encryption-customer-key
のルールに引っ掛かっていることがわかります。
$ tfsec Result #1 HIGH Bucket does not encrypt data with a customer managed key. ──────────────────────────────────────────────────────────────── s3.tf:18-26 ──────────────────────────────────────────────────────────────── 18 resource "aws_s3_bucket_server_side_encryption_configuration" "test" { 19 bucket = aws_s3_bucket.test.bucket 20 21 rule { 22 apply_server_side_encryption_by_default { 23 sse_algorithm = "AES256" 24 } 25 } 26 } ──────────────────────────────────────────────────────────────── ID aws-s3-encryption-customer-key Impact Using AWS managed keys does not allow for fine grained control Resolution Enable encryption using customer managed keys
ルールの除外(コメント)
以下のように、コメントで除外することもできます。
resource "aws_s3_bucket" "test" { bucket = "test-220806" } resource "aws_s3_bucket_acl" "test" { bucket = aws_s3_bucket.test.bucket acl = "private" } resource "aws_s3_bucket_public_access_block" "test" { bucket = aws_s3_bucket.test.id block_public_acls = true ignore_public_acls = true block_public_policy = true restrict_public_buckets = true } #tfsec:ignore:aws-s3-encryption-customer-key resource "aws_s3_bucket_server_side_encryption_configuration" "test" { bucket = aws_s3_bucket.test.bucket rule { apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } }
手軽にできてとてもいいですね。
ただ、S3バケットを大量に作成し全てにルールの除外を適用したい場合は、ルールを複数回書く必要があります。
ルールの除外(configファイル)
以下の内容で、tfsec.ymlを作成します。
--- exclude: - aws-s3-encryption-customer-key
ファイルを用意したらconfigファイルを指定して実行することで、ルールが除外した上でtfsecを実行できます。
(ちなみに、.tfsec/config.yml
という形でファイル配置すると指定しなくても自動的に読み込まれます。)
$ tfsec --config-file tfsec.yml
pre-commit-terrformでconfigファイルを指定する
フォルダで環境を分けている場合は少し注意が必要です。
例えば、以下のようにルートにtfsecのconfigファイルがあって全環境に適用したいパターンです。
├── tfsec.yml └── envs └── stg └── prd
ファイル名だけ指定すると、各環境フォルダ配下のtfsec.yamlを参照するため絶対パスで指定する必要があります。
default_stages: [commit] repos: - repo: https://github.com/antonbabenko/pre-commit-terraform rev: v1.74.1 hooks: - id: terraform_tfsec args: # - --args=--config-file=tfsec.yaml # 各フォルダ配下のtfsec.yamlを参照 ex envs/stg/tfsec.yaml - --args=--config-file=__GIT_WORKING_DIR__/.tfsec.yml # ルートのtfsec.ymlを参照
antonbabenko/pre-commit-terraform: pre-commit git hooks to take care of Terraform configurations ??
おわりに
configファイルを使用した tfsec のルールの除外についてでした。
今回紹介できていませんでしたが、configファイルを指定してルールの重大度の上書きなども可能です。
運用していくにあたりルールの除外など必要になってくるかと思うため、うまく活用していきたいです。
以上、AWS事業本部の佐藤(@chari7311)でした。